package com.hbsd.paopaobackend.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hbsd.paopaobackend.common.ErrorCode;
import com.hbsd.paopaobackend.exception.BusinessException;
import com.hbsd.paopaobackend.mapper.FriendMapper;
import com.hbsd.paopaobackend.model.domain.Friend;
import com.hbsd.paopaobackend.model.domain.User;
import com.hbsd.paopaobackend.model.request.PageInfo;
import com.hbsd.paopaobackend.model.vo.Friend.FriendListVO;
import com.hbsd.paopaobackend.model.vo.UserVO;
import com.hbsd.paopaobackend.service.FriendService;
import com.hbsd.paopaobackend.service.UserService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author zzh
 * @description 针对表【friend】的数据库操作Service实现

 */
@Service
public class FriendServiceImpl extends ServiceImpl<FriendMapper, Friend>
        implements FriendService {

    @Resource
    private UserService userService;

    /**
     * 分页查询好友列表
     *
     * @param pageInfo
     * @param loginUser
     * @return
     */
    @Override
    public Page<FriendListVO> listFriendPage(PageInfo pageInfo, User loginUser) {
        if (pageInfo == null) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "分页参数不能为空");
        }

        if (loginUser == null) {
            throw new BusinessException(ErrorCode.NOT_LOGIN, "用户未登录");
        }

        Long id = loginUser.getId();
        if (id <= 0 || id == null) {
            throw new BusinessException(ErrorCode.NOT_LOGIN, "用户未登录");
        }

        // 根据用户id查到她的好友列表
        QueryWrapper<Friend> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("uid", id);
        Page<Friend> page = new Page<>(pageInfo.getPageNum(), pageInfo.getPageSize());

        Page<Friend> friendPage = this.page(page, queryWrapper);


        // 遍历好友列表
        List<FriendListVO> list = friendPage.getRecords().stream().map(friend -> {
            // 好友id
            Long fid = friend.getFid();

            FriendListVO friendListVO = new FriendListVO();
            friendListVO.setId(friend.getId());
            friendListVO.setUid(id);
            friendListVO.setFid(fid);

            // 对自己和好友进行赋值他们的个人信息数据
            UserVO userVO1 = new UserVO();
            // 获取到该用户的个人信息
            User user = userService.getById(id);
            // 除了tags标签不赋值，其他的都赋值
            BeanUtil.copyProperties(user, userVO1, "tags");
            // 转换tags标签
            // 如果tags对象不为空，就对他进行转为json对象。如果为空，则返回一个空数组
            userVO1.setTags(Objects.nonNull(user.getTags()) ? JSONUtil.parseArray(user.getTags()).toList(String.class) : new ArrayList<>());

            // 对好友赋值她的个人信息
            UserVO userVO2 = new UserVO();
            User friendUser = userService.getById(fid);
            BeanUtil.copyProperties(friendUser, userVO2, "tags");
            userVO2.setTags(Objects.nonNull(friendUser.getTags()) ? JSONUtil.parseArray(friendUser.getTags()).toList(String.class) : new ArrayList<>());


            // 赋值好友列表VO
            friendListVO.setUserVO(userVO1);
            friendListVO.setFriendVO(userVO2);

            return friendListVO;
        }).collect(Collectors.toList());

        // 封装分页对象
        Page<FriendListVO> friendListVOPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
        // 赋值上面的list
        friendListVOPage.setRecords(list);
        return friendListVOPage;

    }
}




